package persistencia;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Vector;

import domain.Usuario;

public class AdministradorPersistenciaUsuario {
	private static AdministradorPersistenciaUsuario pool;

	private AdministradorPersistenciaUsuario() {

	}

	public static AdministradorPersistenciaUsuario getInstancia() {
		if (pool == null)
			pool = new AdministradorPersistenciaUsuario();
		return pool;
	}

	public void insert(Usuario c) {
		// Obtener conexion BD
		Connection con = PoolConnection.getPoolConnection().getConnection();

		// Generar sentencia SQL
		try {
			// Preparar sentencia insert en tabla destino
			String senten = "INSERT INTO Usuarios (dni, nombre, domicilio, telefono, apellido, email, estado) VALUES (?,?,?,?,?,?,?)";
			PreparedStatement ps = null;
			ps = con.prepareStatement(senten);
			ps.setString(1, c.getDni());
			ps.setString(2, c.getNombre());
			ps.setString(3, c.getDomicilio());
			ps.setString(4, c.getTelefono());
			ps.setString(5, c.getApellido());
			ps.setString(6, c.getEmail());
			ps.setString(7, c.getEstado());

			ps.execute();

			PoolConnection.getPoolConnection().realeaseConnection(con);

		} catch (SQLException e) {
			System.out.println("Mensaje Error al Insertar Cliente: "
					+ e.getMessage());
			System.out.println("Stack Trace al Insertar Cliente: "
					+ e.getStackTrace());
			PoolConnection.getPoolConnection().realeaseConnection(con);
		}

	}

	public void update(Usuario c) {
		// Obtener conexion BD
		Connection con = PoolConnection.getPoolConnection().getConnection();

		// Generar sentencia SQL
		try {
			// Preparar sentencia insert en tabla destino
			String senten = "UPDATE Usuarios set nombre = ? ,domicilio = ? ,telefono = ?, apellido = ?, estado = ?, email = ?, dni = ? where UsuarioId = ?";
			PreparedStatement ps = null;
			ps = con.prepareStatement(senten);
			ps.setString(1, c.getNombre());
			ps.setString(2, c.getDomicilio());
			ps.setString(3, c.getTelefono());
			ps.setString(4, c.getApellido());
			ps.setString(5, c.getEstado());
			ps.setString(6, c.getEmail());
			ps.setString(7, c.getDni());
			ps.setInt(8, c.getId());
			int result = ps.executeUpdate();

			PoolConnection.getPoolConnection().realeaseConnection(con);

		} catch (SQLException e) {
			System.out.println("Mensaje Error al Modificar Cliente: "
					+ e.getMessage());
			System.out.println("Stack Trace al Modificar Cliente: "
					+ e.getStackTrace());
			PoolConnection.getPoolConnection().realeaseConnection(con);
		}

	}

	public void delete(Usuario c) {
		// Obtener conexion BD
		Connection con = PoolConnection.getPoolConnection().getConnection();

		// Generar sentencia SQL
		try {
			// Preparar sentencia insert en tabla destino
			String senten = "DELETE from Usuarios where dni = ?";
			PreparedStatement ps = null;
			ps = con.prepareStatement(senten);
			ps.setString(1, c.getDni());
			ps.execute();

			PoolConnection.getPoolConnection().realeaseConnection(con);

		} catch (SQLException e) {
			System.out.println("Mensaje Error al Borrar Cliente: "
					+ e.getMessage());
			System.out.println("Stack Trace al Borrar Cliente: "
					+ e.getStackTrace());
			PoolConnection.getPoolConnection().realeaseConnection(con);
		}

	}

	public Vector<Usuario> getUsuarios() throws SQLException {
		Vector<Usuario> result = new Vector<Usuario>();

		Connection con = PoolConnection.getPoolConnection().getConnection();

		String senten = "SELECT * FROM Usuarios";

		PreparedStatement ps = con.prepareStatement(senten);
		ResultSet rs = ps.executeQuery();

		while (rs.next())
			result.add(mapUsuario(rs));

		PoolConnection.getPoolConnection().realeaseConnection(con);

		return result;
	}

	public Usuario buscarUsuario(String dni) {
		Usuario c = null;
		// Obtener conexion BD
		Connection con = PoolConnection.getPoolConnection().getConnection();

		// Generar sentencia SQL
		try {
			// Preparar sentencia insert en tabla destino
			String senten = "SELECT * from Usuarios where dni = ?";
			PreparedStatement ps = null;
			ps = con.prepareStatement(senten);
			ps.setString(1, dni);
			ResultSet result = ps.executeQuery();
			while (result.next())
				c = mapUsuario(result);

			PoolConnection.getPoolConnection().realeaseConnection(con);

			return c;
		} catch (SQLException e) {
			System.out.println("Mensaje Error al Borrar Cliente: "
					+ e.getMessage());
			System.out.println("Stack Trace al Borrar Cliente: "
					+ e.getStackTrace());
			PoolConnection.getPoolConnection().realeaseConnection(con);
		}
		return c;
	}

	public Usuario getUsuario(int usuarioId) {
		Usuario c = null;
		// Obtener conexion BD
		Connection con = PoolConnection.getPoolConnection().getConnection();

		// Generar sentencia SQL
		try {
			// Preparar sentencia insert en tabla destino
			String senten = "SELECT * from Usuarios where UsuarioId = ?";
			PreparedStatement ps = null;
			ps = con.prepareStatement(senten);
			ps.setInt(1, usuarioId);
			ResultSet result = ps.executeQuery();
			while (result.next())
				c = mapUsuario(result);

			PoolConnection.getPoolConnection().realeaseConnection(con);

			return c;
		} catch (SQLException e) {
			PoolConnection.getPoolConnection().realeaseConnection(con);
		}
		return c;
	}

	private Usuario mapUsuario(ResultSet result) throws SQLException {
		return new Usuario(result.getInt("UsuarioId"), result.getString("nombre"),
				result.getString("apellido"), result.getString("domicilio"),
				result.getString("dni"), result.getString("telefono"), result.getString("email"), result.getString("estado"));
	}
}
